Self-Learned Algorithms - 02
This is my learning note about algorithms.
Reference
- 《小浩算法》) - 链表系列
19.删除链表倒数第N个节点
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
题解
- 哨兵节点的应用:一个附加在原链表最前面用来简化边界条件的附加节点,它的值域不存储任何东西,只是为了操作方便而引入。
- 要求一次遍历?那么就不存在第一次遍历找到链表长度,然后第二次遍历找到该节点。
解法
- 双指针
1 | Node = ListNode(None) |
- 递归
1 | global i |
递归的好处在于无论删除哪一个节点都可以返回正确的节点。(那么除了利用global i
是否还有其他方法可以处理递归的次数呢,比如直接处理n
?)
(递归的内存消耗比双指针稍高)
21.合并两个有序链表
https://leetcode-cn.com/problems/merge-two-sorted-lists
题解
- 设置一个哨兵节点,然后指向两个剩余链表中较小的一个
解法
- 双指针
1 | pre = ListNode(None) |
- 递归法
1 | if l1 and l2: |
最后的return l1 or l2
是防止l1
为空、l2
不为空时输出为空的情况发生。
备注:
在 Python 中,and
和 or
都有提前截至运算的功能。
and
:如果and
前面的表达式已经为False
,那么and
之后的表达式将被 跳过,返回左表达式结果or
:如果or
前面的表达式已经为True
,那么or
之后的表达式将被跳过,直接返回左表达式的结果
例子:[] and 7
等于 []
141.环形链表
https://leetcode-cn.com/problems/linked-list-cycle
题解
- 题目看起来很简单,但是中文版的描述也讲了很多无关紧要的东西,所以评论区才会出现各种奇奇怪怪的解法(?)
解法
- 哈希表:记录访问过的位置
1 | dic = {} |
- 列表:利用列表寻找是否存在重复的对象
1 | if not head: |
- 双指针:定义一个快指针和慢指针,每次快指针走2步,慢指针走1步,判断快指针是否与慢指针重逢。可以有效的减少空间复杂度和时间复杂度的匹配次数
1 | slow = fast = head |
- 奇奇怪怪的神仙解法(不能学习)
1 | # 把访问过的值都进行赋值,如果链表完全成环,则必会出现重复值 |